#pragma once
#include <thread>

namespace utils {

// 枚举类，定义线程操作
enum class ThreadAction
{
    Join,   // 线程操作：加入
    Detach // 线程操作：分离
};

class ThreadGuard {
public:
    // 构造函数，接受一个std::thread引用和一个ThreadAction枚举值，默认值为ThreadAction::Join
    ThreadGuard(std::thread& t, ThreadAction action = ThreadAction::Join)
        : t_(t), action_(action) 
    {
        if (action_ == ThreadAction::Detach && t_.joinable()) {
            t_.detach();
        }
    }

    // 禁止拷贝构造函数
    ThreadGuard(const ThreadGuard&) = delete;

    // 禁止赋值操作符
    ThreadGuard& operator=(const ThreadGuard&) = delete;

    // 析构函数
    ~ThreadGuard() {
        // 如果ThreadAction为Join且线程可join，则等待线程结束
        if (action_ == ThreadAction::Join && t_.joinable()) {
            t_.join();
        }
    }

private:
    std::thread& t_;
    ThreadAction action_;
};

} // namespace utils